import js from '@eslint/js'
import { defineConfig } from 'eslint/config'
import pluginPrettier from 'eslint-plugin-prettier'
import simpleImportSort from 'eslint-plugin-simple-import-sort'
import unusedImports from 'eslint-plugin-unused-imports'
import pluginVue from 'eslint-plugin-vue'
import globals from 'globals'
import tseslint from 'typescript-eslint'

const ignores = [
  'dist/**',
  'node_modules/**',
  'unpackage/**',
  '*.d.ts',
  '*.min.js',
  '.eslintcache',
  '.prettierignore',
]

// uni-app 全局变量
const uniAppGlobals = {
  // uni-app 核心全局变量
  uni: true, // uni-app API 对象
  wx: true, // 微信小程序 API 兼容对象
  WechatMiniprogram: true, // 微信小程序类型声明
  getCurrentPages: true, // 获取页面栈方法

  // uni-app 类型相关
  UniApp: true, // uni-app 类型命名空间
  UniHelper: true, // uni-app 助手类型
  Page: true, // 页面构造器
  Component: true, // 组件构造器
  AnyObject: true, // 通用对象类型

  // uni-app 特定的 API
  uniCloud: true, // uni-app 云开发 API
  plus: true, // HTML5+ API
  upx2px: true, // upx 转 px 方法

  // 小程序特定
  getApp: true, // 获取应用实例
  App: true, // App 构造函数
  Behavior: true, // 小程序 Behavior
  tt: true, // 字节跳动小程序
  my: true, // 支付宝小程序
  swan: true, // 百度小程序
  qq: true, // QQ小程序
  ks: true, // 快手小程序
  jd: true, // 京东小程序
}

export default defineConfig([
  // 基础设置
  {
    ignores,
    linterOptions: {
      reportUnusedDisableDirectives: true, // 报告未使用的禁用指令
    },
  },
  // 通用文件的配置
  {
    files: ['**/*.{js,mjs,cjs,ts,tsx,vue,nvue}'],
    plugins: {
      js,
      'simple-import-sort': simpleImportSort,
      'unused-imports': unusedImports,
      prettier: pluginPrettier,
    },
    extends: ['js/recommended'],
    languageOptions: {
      ecmaVersion: 2022,
      sourceType: 'module',
      globals: {
        ...globals.browser,
        ...globals.node,
        ...globals.es2025,
        ...uniAppGlobals,
      },
    },
    rules: {
      'no-undef': 'off', // 关闭未定义变量检查，避免Vue模板变量报错
      'no-unused-vars': 'off', // 关闭原生未使用变量检查，由TS规则处理
      'no-console': ['warn', { allow: ['warn', 'error'] }], // 限制控制台输出
      'no-debugger': 'warn', // 警告调试器语句
      'simple-import-sort/imports': [
        'error', // 强制import排序
        {
          groups: [
            // 将所有导入合并为单一分组，避免生成空行分隔 - 外部导入 > 内部导入 > 相对导入 > 绝对导入
            ['^\\u0000', '^@?\\w', '^@/', '^\\.'],
          ],
        },
      ], // 强制import排序
      'simple-import-sort/exports': 'error', // 强制export排序
      'unused-imports/no-unused-imports': 'error', // 禁止未使用的导入
    },
  },
  tseslint.configs.recommended,
  pluginVue.configs['flat/essential'],

  // TypeScript 文件的配置
  {
    files: ['**/*.{ts,tsx,vue,nvue}'],
    rules: {
      '@typescript-eslint/no-unused-vars': [
        'warn',
        {
          argsIgnorePattern: '^_', // 忽略下划线开头的参数
          varsIgnorePattern: '^_', // 忽略下划线开头的变量
        },
      ],
      '@typescript-eslint/consistent-type-imports': [
        'error',
        {
          prefer: 'type-imports', // 优先使用import type
          fixStyle: 'inline-type-imports', // 使用内联类型导入
        },
      ],
      '@typescript-eslint/no-explicit-any': 'warn', // 警告使用any类型
      '@typescript-eslint/no-empty-interface': 'warn', // 警告空接口
      '@typescript-eslint/explicit-module-boundary-types': 'off', // 不强制要求函数返回类型
      '@typescript-eslint/no-unused-expressions': [
        'error',
        { allowShortCircuit: true, allowTernary: true }, // 允许短路运算符和三元运算符
      ],
    },
  },

  // Vue 文件的配置
  {
    files: ['**/*.{vue,nvue}'],
    languageOptions: {
      parser: pluginVue.parser,
      parserOptions: {
        parser: tseslint.parser,
        extraFileExtensions: ['.vue', '.nvue'],
        ecmaVersion: 2022,
        sourceType: 'module',
      },
    },
    rules: {
      // Vue 规则
      'vue/multi-word-component-names': 'off', // 关闭组件名必须多词的规则(uni-app页面通常单字)
      'vue/no-v-html': 'warn', // 警告使用v-html指令(XSS风险)
      'vue/no-mutating-props': 'error', // 禁止直接修改props
      'vue/require-default-prop': 'off', // uni-app环境下关闭props默认值检查
      'vue/block-order': [
        'error',
        {
          order: ['script', 'template', 'style'],
        },
      ],
      'vue/block-lang': [
        'error',
        {
          // 块语言限制
          script: { lang: 'ts' },
        },
      ],
    },
  },
])
